#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <ctype.h>
#include <math.h>

/*
 * C语言基础练习程序集
 * 包含各种常见算法和功能演示
 */

// ========================================
// 主要功能函数声明
// ========================================
void print_digit_separated(int n);
void print_character_triangle(char ch);
void decompose_date_recursive(int x);

// ========================================
// 主函数 - 水仙花数查找程序
// 查找并显示5位数中的特殊数字
// ========================================
int main()
{
    printf("=====================================\n");
    printf("     水仙花数查找程序\n");
    printf("=====================================\n");
    printf("正在查找5位数中的特殊数字...\n\n");
    
    int i = 0;
    int t;
    
    // 遍历所有5位数 (10000-99999)
    for (i = 10000; i < 100000; i++)
    {
        int sum = 0;
        // 计算各个部分的乘积之和
        for (t = 10000; t >= 10; t /= 10)
        {
            sum += (i % t) * (i / t);
        }
        // 如果满足特殊条件，则输出该数字
        if (sum == i) {
            printf("%d ", i);
        }
    }
    
    printf("\n\n查找完成！\n");
    return 0;
}

// ========================================
// 功能函数实现
// ========================================

/*
 * 递归打印数字的每一位（用空格分隔）
 * 参数: n - 需要分解打印的数字
 */
void print_digit_separated(int n)
{
    if (n < 10)
        printf("%d", n);
    else if (n > 10)
    {
        print_digit_separated(n / 10);
        printf(" %d", n % 10);
    }
}

/*
 * 打印字符组成的三角形图案
 * 参数: ch - 用于构建三角形的字符
 */
void print_character_triangle(char ch)
{
    int i, j;
    // 外层循环控制行数 (共5行)
    for (i = 0; i < 5; i++)
    {
        // 打印前导空格，使图形居中
        for (j = 0; j < 4 - i; j++)
        {
            printf(" ");
        }
        // 打印字符，每行比前一行多一个
        for (j = 0; j < i + 1; j++)
        {
            printf("%c ", ch);
        }
        printf("\n");
    }
}

/*
 * 递归分解日期数字
 * 将一个长数字按照年月日格式进行分解
 * 参数: x - 输入的日期数字
 */
void decompose_date_recursive(int x)
{
    if (x < 10000)
    {
        // 四位数表示年份
        printf("Year=%04d\n", x);
    }
    else if(x < 1000000) {
        // 递归处理前面的部分作为年份，后面两位作为月份
        decompose_date_recursive(x / 100);
        printf("Month=%02d\n", x % 100);
    }
    else {
        // 递归处理前面的部分，最后两位作为日期
        decompose_date_recursive(x / 100);
        printf("Day=%02d\n", x % 100);
    }
}

// ========================================
// 其他示例代码 (已注释，仅供学习参考)
// ========================================

/*
// 数据类型大小演示
int data_type_demo()
{
    printf("各种数据类型的大小:\n");
    printf("short: %zd 字节\n", sizeof(short));
    printf("int: %zd 字节\n", sizeof(int));
    printf("long: %zd 字节\n", sizeof(long));
    printf("char: %zd 字节\n", sizeof(char));
    printf("long long: %zd 字节\n", sizeof(long long));
    printf("double: %zd 字节\n", sizeof(double));
    printf("float: %zd 字节\n", sizeof(float));
    return 0;
}

// 进制数输出演示
int number_base_demo()
{
    int num = 1234;
    printf("十进制: %d\n", num);
    printf("八进制: 0%o\n", num);
    printf("十六进制: 0X%X\n", num);
    printf("带前缀的八进制: %#o\n", num);
    printf("带前缀的十六进制: %#X\n", num);
    return 0;
}

// 字符处理演示
int character_processing_demo()
{
    char ch = 0;
    printf("请输入字符 (Ctrl+Z 结束):\n");
    while ((ch = getchar()) != EOF) {
        // 判断是否为字母
        if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z') {
            printf("YES - 是字母\n");
        } else {
            printf("No - 不是字母\n");
        }
        getchar(); // 处理换行符
    }
    return 0;
}

// BMI计算演示
int bmi_calculator()
{
    int weight, height;
    double bmi;
    printf("请输入体重(kg)和身高(cm): ");
    scanf("%d %d", &weight, &height);
    bmi = weight / ((height / 100.0) * (height / 100.0));
    printf("您的BMI指数为: %.3lf\n", bmi);
    return 0;
}

// 三角形面积计算演示
int triangle_area_demo()
{
    double a, b, c;
    printf("请输入三角形三边长: ");
    scanf("%lf %lf %lf", &a, &b, &c);
    double perimeter = a + b + c;
    double semi_perimeter = perimeter / 2;
    double area = sqrt(semi_perimeter * (semi_perimeter - a) * (semi_perimeter - b) * (semi_perimeter - c));
    printf("周长=%.2lf\n", perimeter);
    printf("面积=%.2lf\n", area);
    return 0;
}

// 球体体积计算演示
int sphere_volume_demo()
{
    const float PI = 3.1415926;
    float radius, volume;
    printf("请输入球体半径: ");
    scanf("%f", &radius);
    volume = 4.0/3 * PI * radius * radius * radius;
    printf("球体体积=%.3f\n", volume);
    return 0;
}
*/